var exceptionModel = require('../model/exceptionDao').ExceptionModel;
/**
 *
 * 描述：异常记录处理
 *
 * HISTORY
 * ****************************************************************************
 *  ID   DATE           			         PERSON          REASON
 *  1    2015年7月13日 下午13:43:38      Ghold          Create
 * ****************************************************************************
 */

var exceptionCon = {
    errors: {
        GENERAL_ERROR: function(res, message) {
            res.json({ meta: { status: -1, message: message || '一般错误' }, data: {} });
        },
        NOT_AUTHORIZED: function(res, message) {
            res.json({ meta: { status: -2, message: message || '没有权限' }, data: {} });
        },
        SYSTEM_ERROR: function(res, message) {
            res.json({ meta: { status: -1, message: message || '系统错误' }, data: {} });
        },
        PARAMETER_ERROR: function(res, message) {
            res.json({ meta: { status: -1, message: message || '参数异常' }, data: {} });
        },
        VERIFY_ERROR: function(res, message) {
            res.json({ meta: { status: -1, message: message || '校验失败' }, data: {} });
        },
        OPERATION_ERROR: function(res, message) {
            res.json({ meta: { status: -1, message: message || '非法操作' }, data: {} });
        },
        TIMEOUT_ERROR: function(res, message) {
            res.json({ meta: { status: -3, message: message || '下单时间超过规定时间，无法赔付' }, data: {} });
        },
        PICK_TIMEOUT_ERROR: function(res, message) {
            res.json({ meta: { status: -4, message: message || '不能在20:00到次日8点间提货' }, data: {} });
        },
        FORCE_TO_CANCEL: function(res, message) {
            res.json({ meta: { status: -5, message: message || '超过5分钟取消' }, data: {} });
        },
        EXISTED: function(res, message) {
            res.json({ meta: { status: -6, message: message || '账号已被注册' }, data: {} });
        }
    },
    warns: {
        NOT_EXISTED: function(res, message) {
            res.json({ meta: { status: 0, message: message || '信息不存在' }, data: {} });
        },
        IS_EXISTED: function(res, message) {
            res.json({ meta: { status: 0, message: message || '信息已存在' }, data: {} });
        }
    },
    monitorErrors: {
        SYSTEM_ERROR: function(message) {
            console.error(message || '系统错误');
        }
    },

    /**
     *  需要生成异常记录的情况
     *
     */
    createException: function(object, objectModel, type, desc, done) {
        var info = {
            object: object,
            objectModel: objectModel,
            exceptionType: type,
            desc: desc,
            status: 1,
            createDt: Date.parse(new Date().toLocaleString())
        };

        exceptionModel.create(info, function(err, doc) {
            if (err) {
                console.error('保存异常错误，异常对象Id：' + info.object + '，异常对象模型：' + info.objectModel);
                return done(err, null);
            }
            done(null, doc);
        });
    },

    /**
     *  通过对象，对象模型，异常类型查找异常
     *
     */
    findException: function(object, objectModel, type, done) {
        exceptionModel
            .findOne({
                    object: object,
                    objectModel: objectModel,
                    exceptionType: type
                },
                function(err, doc) {
                    if (err) {
                        console.error('查找异常错误，异常对象Id：' + doc.object + '，异常对象模型：' + doc.objectModel);
                        return done(err, null);
                    }
                    done(null, doc);
                });
    },

    /**
     *  更新或者插入
     *
     */
    updateOrCreateException: function(object, objectModel, type, desc, status, done) {
        exceptionCon.findException(object, objectModel, type, function(err, reply) {
            if (err) return done(err, null);
            if (reply) {
                var update = {
                    desc: desc,
                    status: status,
                    updateDt: Date.parse(new Date().toLocaleString())
                };

                reply.update(update, function(err, reply) {
                    if (err) {
                        console.error('更新异常错误，异常对象Id：' + reply.object + '，异常对象模型：' + reply.objectModel);
                        return done(err, null);
                    }
                    done(null, reply);
                });
            } else {
                if (status == 2) return done(null, null);
                exceptionCon.createException(object, objectModel, type, desc, function(err, reply) {
                    if (err) return done(err, null);
                    done(null, reply);
                });
            }
        });
    }
};

module.exports.__proto__ = exceptionCon;
